﻿/*
 * Criado por SharpDevelop.
 * Usuário: henry
 * Data: 07/06/2011
 * Hora: 13:53
 * 
 * Para alterar este modelo use Ferramentas | Opções | Codificação | Editar Cabeçalhos Padrão.
 */
using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;



namespace GeraPlanilha
{
	/// <summary>
	/// Pesquisa e recupera informações referente ao controle de estoque
	/// </summary>
	public class EstoqueDAO
	{
		private ImportaExcel excel = new ImportaExcel();
		private string conn ="Data Source=192.168.0.10;Initial Catalog=fabricaracao;Integrated Security=SSPI;";
		
		public EstoqueDAO()
		{
		}
		
		/// <summary>
		/// Retorna consulta com os dados da balança e da fabrica
		/// </summary>
		/// <returns>Lista de Estoque</returns>
		private  List<Estoque>  PorData(Estoque estoque)
		{
			string query = " SELECT "+
				"	BAT.DESCRICAO, "+
				"	BAT.DATA, "+
				"	ISNULL(SUM(BAT.PESO),0) AS [FABRICA],   "+
				"	ISNULL((SELECT SUM(PESO) FROM VIEW_GUARDIAN WHERE BAT.DATA = DATA AND BAT.DESCRICAO = DESCRICAO), 0) AS [BALANCA], "+
				"	ISNULL(SUM(BAT.PESO),0) - ISNULL((SELECT SUM(PESO) FROM VIEW_GUARDIAN WHERE BAT.DATA = DATA AND BAT.DESCRICAO = DESCRICAO), 0) AS [TOTAL] "+
				"	FROM  VIEW_BATIDAS BAT "+
				" WHERE BAT.DATA BETWEEN '"+FormataData(estoque.DataInicial)+"' AND '"+FormataData(estoque.DataFinal)+"'  "+
				"	GROUP BY BAT.DESCRICAO , BAT.DATA "+
				"	ORDER BY BAT.DESCRICAO ASC, BAT.DATA ASC  ";
			
			
			List<Estoque> estoques = new List<Estoque>();
			using (SqlConnection connection = new SqlConnection(conn))
			{
				using (SqlCommand cmd = new SqlCommand(query, connection))
				{
					cmd.CommandType = CommandType.Text;
					connection.Open();
					
					SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
					Estoque est;
					
					while(reader.Read())
					{
						est = new Estoque();
						est.Racao = reader.GetString(0);
						est.Data = reader.GetDateTime(1);
						est.Fabrica = reader.GetDouble(2);
						est.Balanca = -1 *  reader.GetDouble(3);
						est.Total = reader.GetDouble(4);
						estoques.Add(est);
					}
				}
			}
			return estoques;
		}
		
		
		/// <summary>
		/// Pega a menor dada, por ração
		/// </summary>
		/// <param name="estoque">Recebe Estoque</param>
		/// <returns>Retorna um dicionario com o nome da ração e a menor dada, a ração é a chave</returns>
		private Dictionary<string, DateTime> RetornaMenorData(Estoque estoque)
		{
			List<string> racoes = new List<string>();
			racoes.Add("RACAO INICIAL");
			racoes.Add("RACAO POSTURA III" );
			racoes.Add("RACAO POSTURA II" );
			racoes.Add("RACAO POSTURA I" );
			racoes.Add("RACAO CRESC. II" );
			racoes.Add("RACAO CRESC. l" );
			racoes.Add("RACAO CRESCIMENTO II");
			racoes.Add("RACAO CRESCIMENTO l");
			
			
			Dictionary<string, DateTime> menorDataDaRacao = new Dictionary<string, DateTime>();
			foreach(string rac in racoes)
			{
				string query =
					"  SELECT  "+
					"	BAT.DATA  "+
					"	FROM  VIEW_BATIDAS BAT "+
					" WHERE BAT.DATA BETWEEN '"+FormataData(estoque.DataInicial)+"' AND '"+FormataData(estoque.DataFinal)+"'  and BAT.DESCRICAO = '"+rac+"'  "+
					" GROUP BY BAT.DESCRICAO , BAT.DATA  "+
					" ORDER BY BAT.DESCRICAO ASC, BAT.DATA ASC  ";
				
				
				using ( SqlConnection connection = new SqlConnection(conn))
				{
					connection.Open();
					SqlCommand command = connection.CreateCommand();
					command.CommandText = query;
					
					SqlDataReader reader = command.ExecuteReader();
					while (reader.Read())
					{
						if(!reader.IsDBNull(0))
						{
							if(!menorDataDaRacao.ContainsKey(rac))
								menorDataDaRacao.Add(rac, reader.GetDateTime(0));
						}
					}
				}
			}
			return menorDataDaRacao;
		}
		
		
		/// <summary>
		/// Formata as datas iniciais de produção da ração
		/// </summary>
		/// <param name="estoque">Recebe estoque com as dadas iniciais e finais</param>
		/// <returns>Retorna as dadas formatadas</returns>
		public List<Estoque> FormataDadasESaldo(Estoque estoque)
		{
			Dictionary<string, DateTime>  menoresDadas = RetornaMenorData(estoque);
			List<Estoque> racoes = PorData(estoque);
			
			foreach(string racao in menoresDadas.Keys)
			{
				for(int i = 0; i< racoes.Count; i++)
				{
					DateTime d = racoes[i].Data;
					string r = racoes[i].Racao;
					if(d == menoresDadas[racao] && r == racao)
					{
						racoes[i].Saldo = 0;
					}
					else
					{
						if(racoes[i].Racao == racao)
						{
							if( i- 1>=0)
							{
								double totalAnterior= racoes[i-1].Total;
								racoes[i].Saldo = totalAnterior;

								racoes[i].Total = (totalAnterior + racoes[i].Fabrica) + racoes[i].Balanca;
								
								
								// if(totalAnterior > 0)
								// {
								//	racoes[i].Total += totalAnterior;
								//	}
								//	else
								//	{
								//			racoes[i].Total -= (-1 * totalAnterior);
								//		}
							}
						}
					}
				}
			}
			
			return racoes;
		}
		
		public void SalvaNoExcell(string path,  List<Estoque> estoques)
		{
			int i =2;
			TituloColunas();

			foreach(Estoque est in estoques)
			{
				excel.Escrever(i, 1, est.Data.ToShortDateString());
				excel.Escrever(i, 2, est.Racao);
				excel.Escrever(i, 3, est.Saldo.ToString());
				excel.Escrever(i, 4, est.Fabrica.ToString());
				excel.Escrever(i, 5, est.Balanca.ToString());
				excel.Escrever(i, 6, est.Total.ToString());
				i++;
			}
			excel.Salvar(path);
			excel.Sair();
		}
		
		private void TituloColunas()
		{
			excel.NovaPlanilha();
			excel.Escrever(1,1,"Data");
			excel.Escrever(1,2,"Ração");
			excel.Escrever(1,3,"Salto Inicial");
			excel.Escrever(1,4,"Produção Fabrica");
			excel.Escrever(1,5,"Envio Galpões");
			excel.Escrever(1,6,"Total");
		}
		
		private string FormataData(DateTime data)
		{
			return data.Year +"-"+ data.Month+"-"+data.Day+ " 00:00:00.000";
		}
	}
}
